package org.fixies.utils;

import java.util.Iterator;
import java.util.LinkedHashMap;

/**
 * 先入れ先出し方式のMap実装クラス
 * 最大容量を超えた場合は、最初に追加された要素が削除される。
 *
 * @author Tsuyoshi
 * @param <K> キー
 * @param <V> 値
 */
public class FIFOMap<K, V> extends LinkedHashMap<K, V> {

    /**
     * SUID
     */
    private static final long serialVersionUID = 1L;

    /**
     * 最大容量
     */
    private final int maxSize;


    /**
     * コンストラクタ
     *
     * @param maxSize 最大容量
     */
    public FIFOMap(int maxSize) {
        this.maxSize = maxSize;
    }

    /**
     * {@inheritDoc}
     */
    private void removeFirst() {
        Iterator<K> itr = keySet().iterator();
        if (itr.hasNext()) {
            itr.remove();
        }
    }

    /**
     * {@inheritDoc}
     */
    public V put(K key, V value) {
        if (size() == maxSize) {
            removeFirst();
        }
        return super.put(key, value);
    }
}
